//防抖: n 秒后在执行该事件，若在 n 秒内被重复触发，则重新计时
//简单实现
function debounce1(func, wait) {
    let timeout;
    return function () {
        let context = this; // 保存this指向
        let args = arguments; // 拿到event对象
        clearTimeout(timeout)
        timeout = setTimeout(function () {
            func.apply(context, args)
        }, wait);
    }
}

// 防抖如果需要立即执行，可加入第三个参数用于判断，实现如下：
function debounce(func, wait, immediate) {
    let timeout;
    return function () {
        let context = this;
        let args = arguments;
        if (timeout) clearTimeout(timeout); // timeout 不为null
        if (immediate) {
            /**
             * 只有在callNow值为true时才会触发功能函数
             * 第一次调用防抖函数，还没有定时器，触发功能函数
             * 在时间间隔内如果再次调用防抖函数，这时已经有定时器在了，即使清除定时器，但定时器标识符timeout还在，所以callNow的值是false,不能触发功能函数
             * 等定时器间隔过去后执行定时器里的代码，将定时器标识符timeout设置为null
             * 之后再调用防抖函数才会让callNow的值为true,触发功能函数
             * */
            let callNow = !timeout;
            timeout = setTimeout(function () {
                timeout = null;
            }, wait)
            if (callNow) func.apply(context, args)
        } else {
            timeout = setTimeout(function () {
                func.apply(context, args)
            }, wait);
        }
    }
}
